/*
 * Copyright 2009 Kaspar Minosiants http://www.minosiants.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.minosiants.confluence.blog.plugin.impl.tweet2it;

import java.util.HashMap;
import java.util.Map;

import com.atlassian.spring.container.ContainerManager;
import com.minosiants.confluence.blog.plugin.tweet2it.IDataReopository;
import com.minosiants.confluence.blog.plugin.tweet2it.IOAuthManager;

/**
 *	Project home: http://tweet2it.minosiants.com
 *
 *  @author Kaspar Minosiants
 *
 * 	$Id:$
 */
public class OAuthManager implements IOAuthManager {	
	private Map<String,TwitterOAuthController> twitterOAuthControllers;	
	private IDataReopository dataReopository;
	private OAuthManager() {
		super();
		twitterOAuthControllers=new HashMap<String, TwitterOAuthController>();				
	}

	public String getAuthUrlFor(String authUserId){
		return getTwitterOAuthController(authUserId).retrieveRequestToken(null);
	}

	public boolean storeTokenWithSecretFor(String id,String authUserId, String pin){
		synchronized (this) {
			TwitterOAuthController controller=getTwitterOAuthController(authUserId);
			OAuthUserData oauthUserData=controller.retrieveOAuthUserData(authUserId,pin);
			if(oauthUserData==null)
				return false;			
			getDataReopository().storeOAuthUserData(id,oauthUserData);
			twitterOAuthControllers.remove(authUserId);
			return true;
		}
		
	}
	private TwitterOAuthController getTwitterOAuthController(String userId) {
		synchronized (userId) {
			return twitterOAuthControllers.containsKey(userId) ? twitterOAuthControllers.get(userId):addNewControllerForUser(userId);	
		}
		 
	}
	private TwitterOAuthController addNewControllerForUser(String userId) {
		twitterOAuthControllers.put(userId, new TwitterOAuthController());
		return twitterOAuthControllers.get(userId);
	}
	

	public OAuthUserData getUserData(String id){		
		return getDataReopository().getOAuthUserData(id);
	}

	public void setDataReopository(IDataReopository dataReopository) {
		this.dataReopository = dataReopository;
	}

	public IDataReopository getDataReopository() {
		if(dataReopository==null)
			ContainerManager.autowireComponent(this);
		return dataReopository;
	}

	@Override
	public void removeUser(String userId) {
		getDataReopository().removeOAuthUserData(userId);		
	}



}
